
using System;
using System.Collections.Generic;
using System.Linq;
using M0;
using M1;
using Newtonsoft.Json;
using UnityEngine;
using Random = UnityEngine.Random;

public class 二合小镇 : BaseSingleMono<二合小镇>
{
    private const string user缓存Key = "user缓存Key";
    [SerializeField] private User u;

    public User GetUser => u;
    
    private void Awake()
    {
        M.Event.AddEvent(M.EventKey_游戏开始,开始游戏);
        M.Event.AddEvent<string>(M.EventKey_切换场景,切换场景事件);
        M.Event.AddEvent<int>(M.EventKey_接受任务,接受任务);
        M.Event.AddEvent<int>(M.EventKey_完成任务,完成任务);
        M.Event.AddEvent<(int,int,int)>(M.EventKey_更新任务,更新任务);
        M.Event.AddEvent(M.EventKey_保存数据,单独保存);
        M.Event.AddEvent<int>(M.EventKey_碰撞,碰撞函数);
        初始化数据();
    }

    private void 更新任务((int,int,int) 进度)
    {
        
    }

    private void 完成任务(int id)
    {
        Debug.Log("完成任务");
        任务数据.Instance.触发完成任务逻辑(id);
        var 下一个任务 = 任务数据.Instance.下个任务(id);
        if (下一个任务 != null)
        {
            Task管理器.Instance.接受任务(下一个任务);
        }
    }


    private int 皮肤种类;
    private string 皮肤数据位数;
    private void 初始化数据()
    {
        
        皮肤种类 = Enum.GetValues(typeof(皮肤部位)).Length;
        for (int i = 0; i < 皮肤种类; i++)
        {
            皮肤数据位数 = 皮肤数据位数 + "00";
        }
    }

    private void Start()
    {
        u = M.Get缓存<User>(user缓存Key);
        if (string.IsNullOrEmpty(u.name))
        {
            int 随机 = Random.Range(0, 999999);
            string name = "玩家" + 随机.ToString("000000");
            u.name = name;
        }
    }


    // protected override void UpdateFunc()
    // {
    //     base.UpdateFunc();
    //     if (Input.GetMouseButtonDown(0))
    //     {
    //         var camera = GameObject.FindWithTag("MainCamera");
    //         Ray ray = camera.GetComponent<Camera>().ScreenPointToRay(Input.mousePosition);
    //         
    //         I可点击 点击 = M.射线检测<I可点击>(ray);
    //         // Debug.Log(点击);
    //     }
    // }

    private void 单独保存()
    {
        M.保存缓存(user缓存Key,JsonConvert.SerializeObject(u));
    }

    private void OnDestroy()
    {
        M.Event.RemoveEvent(M.EventKey_游戏开始,开始游戏);
        M.Event.RemoveEvent<string>(M.EventKey_切换场景,切换场景事件);
        M.Event.RemoveEvent<int>(M.EventKey_接受任务,接受任务);
        M.Event.RemoveEvent<int>(M.EventKey_完成任务,完成任务);
        M.Event.RemoveEvent<(int,int,int)>(M.EventKey_更新任务,更新任务);
        M.Event.RemoveEvent(M.EventKey_保存数据,单独保存);
        M.Event.RemoveEvent<int>(M.EventKey_碰撞,碰撞函数);
    }

    private void 碰撞函数(int id)
    {
        if (id != -1)
        {
            var 进行中的任务 = M二合小镇.Get进行中的任务();
            var 任务 = 进行中的任务.Where(w => w.寻路 == 寻路Type.寻路Npc && w.寻路参数 == id).ToList();
            if (任务.Count == 1 && 任务[0].完成条件 == 完成任务条件.对白完成)
            {
                var 完成对白 = 任务[0].完成参数;
                var win = Window管理器.Instance.OpenWindow<对话窗口View>();
                win.SetUpDialog(完成对白);
            }
        }
    }


    #region 获得游戏皮肤

    public int Get使用的皮肤名字(皮肤Data type,int sex)
    {
        return u.Get使用的皮肤Index(type.Type, sex, 皮肤数据位数,type.Index);
    }

    public void 更新皮肤(皮肤Data data,int 使用情况)
    {
        if (data.Type == 皮肤部位.装饰)
        {
            u.更新装饰(data.Index,使用情况);
        }
        else
        {
            u.更新皮肤(data,皮肤数据位数);
        }
    }

    public List<皮肤装饰> Get使用的装饰()
    {
        return u.Get使用的装饰();
    }

    #endregion

    
    
    private void 开始游戏()
    {
        M.Event.DoEvent(M.EventKey_切换场景,场景枚举.城市.ToString());
        // return;
        var 进行中的任务 =M二合小镇.Get进行中的任务();
        if (进行中的任务.Count == 0)
        {
            //新游戏
            var 任务1 = 任务数据.Instance.任务1;
            Task管理器.Instance.接受任务(任务1);
        }
        else
        {
            foreach (var VARIABLE in 进行中的任务)
            {
                Task管理器.Instance.接受任务(VARIABLE);
            }
        }
        
        Window管理器.Instance.OpenWindow<主界面View>();
    }


    public string 当前场景;
    public void 切换场景事件(string s)
    {
        场景逻辑数据.Instance.执行切换场景(s);
        当前场景 = s;
    }
    private void 接受任务(int id)
    {
        任务数据.Instance.触发接受任务逻辑(id);
    }

    public void 保存性别(bool cur女主)
    {
        u.更新性别(cur女主 ? 0 : 1);
    }
    public int GetCur性别()
    {
        return u.cur性别;
    }
    
    
}

public enum 场景枚举
{
    城市,
}
